package com.heng.locks;

import org.junit.Test;

import java.util.concurrent.TimeUnit;

class Phone {
    public synchronized void sendEmail() {
        System.out.println("---sendEmail");
    }

    public synchronized void sendSMS() {
        System.out.println("---sendSMS");
    }

    public void hello() {
        System.out.println("---hello");
    }
}
//线程  操作  资源类
public class Lock8Demo {

    public static void main(String[] args) {

    }
    @Test
    public void test1() {
        //1.syn加在非静态方法上，(应该会锁资源类,)锁的是当前对象this,对象锁！
        //被锁后，其他的线程都不能进入到当前对象的其他的syn方法
        Phone phone = new Phone();
        new Thread(() -> {
            phone.sendEmail();
        },"a").start();
        try {TimeUnit.SECONDS.sleep(3);}catch (InterruptedException e) {e.printStackTrace();}
        new Thread(() -> {
            phone.sendSMS();
        },"b").start();
    }


    @Test
    public void test2() {
        //syn加在非静态方法上，其他线程在访问未被syn修饰的方法时是可以的，不会出现被锁门外的情况！！
        Phone phone = new Phone();
        new Thread(() -> {
            try {TimeUnit.SECONDS.sleep(3);}catch (InterruptedException e) {e.printStackTrace();}

            phone.sendEmail();
        },"a").start();

        new Thread(() -> {
            phone.hello();
        },"b").start();
    }

    @Test
    public void test3() {
        //两个实例变量，不会出现资源的抢夺的！
        Phone phone1 = new Phone();
        Phone phone2 = new Phone();
        new Thread(() -> {
            phone1.sendEmail();
        },"a").start();
        try {TimeUnit.SECONDS.sleep(3);}catch (InterruptedException e) {e.printStackTrace();}
        new Thread(() -> {
            phone2.sendSMS();
        },"b").start();
    }

    @Test
    public void test4() {
        //5.一个实例对象，syn修饰两个静态方法
        //6.两个实例对象，syn修饰两个静态方法。还是先执行a线程
        //syn修饰静态方法，是类锁！锁的是类。也是只会锁syn修饰的方法！！！
        Phone phone = new Phone();

        new Thread(() -> {
//            try {TimeUnit.SECONDS.sleep(3);}catch (InterruptedException e) {e.printStackTrace();}
            phone.sendEmail();
        },"a").start();

        new Thread(() -> {
            phone.hello();
        },"b").start();


    }



}
